#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>

//#include <log4c/log.h>
#include <server/invokeproxy.h>
#include <cJSON/cJSON.h>
#include <server/broadcast.h>

bc_app_st *s_app_table;
/**
 * 描述：插件内部广播入口。
 *
 * 入参：[INT]		[IN]	[bc_id]:广播码，枚举。
 * 		 [cJSON*]	[IN]	[cj]:广播参数。
 * 返回值：无
 *
 * 作者：王学飞
 * 日期：2016-2-2
 *
 *
 * **/
void call_broadcast_entry(int bc_id, cJSON *cj)
{
	bc_app_st *p;
	//LOG_DEBUG("broad_cast=====>");
	p = s_app_table[bc_id].next;
	while(p){
		//LOG_DEBUG("p = %p",p);
		p->bc_call_entry(cj);
		p = p->next;
		//LOG_DEBUG("p = %p",p);
	}
}
/**
 * 描述：注册广播函数入口，单链表存放，最后一个为NULL.
 *
 * 参数：[bc_app_st]	[IN]	[bc_obj]
 * 		 :广播节点对象，存放入口地址与next指针
 * 	返回值：无
 *
 * 	作者：王学飞
 * 	日期：2016-2-3
 *
 * **/
void register_broadcast_entry(bc_app_st *bc_obj)
{
	//LOG_DEBUG("register broadcast!!!!");
	//bc_obj->next = s_app_table[bc_obj->bc_id].next;
	//s_app_table[bc_obj->bc_id].next = bc_obj;
}

/**
 * 描述：获取动态库中的注册广播对象。
 *
 * 参数：[void*]	[IN]	[handle]:dlopen返回的动态库句炳。
 * 返回值:无
 *
 * 作者：王学飞
 * 日期：2016-2-3
 *
 * **/
void bc_deal_with_handle(void *handle)
{
	bc_app_st *(*get_object_broadcast)(void *bc_handle);
	int (*get_object_broadcast_num)(void);
	int broadcast_num;
	int i;
	bc_app_st *bc_obj;

	i = 0;

	get_object_broadcast = dlsym(handle, "get_object_broadcast");
	if(!get_object_broadcast){
		//LOG_ERROR("can't find broadcast!!");
		return ;
	}

	get_object_broadcast_num = dlsym(handle, "get_object_broadcast_num");

	bc_obj = get_object_broadcast(call_broadcast_entry);
	if(!bc_obj){
		//LOG_ERROR("can't get broadcast!!!!");
		return;
	}
	
	broadcast_num = get_object_broadcast_num();
	//LOG_DEBUG("broadcast_num = %d",broadcast_num);
	while(i < broadcast_num){
		register_broadcast_entry(bc_obj++);
		i++;
	}
}
/**
 * 描述：广播模块初始化函数。
 *
 * 参数：无
 * 返回值：无
 *
 * 作者：王学飞
 * 日期：2016-2-7
 *
 * **/
void broadcast_init(void)
{
	
	s_app_table = malloc(BC_MAX_ID * sizeof(bc_app_st));
	if(!s_app_table){
		//LOG_ERROR("malloc error!");
		exit(0);
	}
	memset(s_app_table, 0, BC_MAX_ID * sizeof(bc_app_st));
	
}

/**
 * 描述：广播模块卸载函数。
 *
 * 参数：无
 * 返回值：无
 *
 * 作者：王学飞
 * 日期：2016-2-7
 *
 * **/
void broadcast_fini(void )
{
	;
}
